/*******************************************************************************
 * lora.tablegrid.js
 * 
 * 插件名称: 表格插件
 * jQuery版本:1.9+
 * 国际惯例：Bladnir 中国大陆 第二大区三战场组 奥拉基尔
 * 邮箱：bladnir@outlook.com
 * 创建时间：2015年6月3日 
 * 描述：生成表格
 * 
 * 参数说明:{
 * 
 *  url : 字符串, 获取数据url 默认 null
 *  columns : 数组, 列数组  默认 null
 *  data : 数组,  测试用 默认null
 *  tableWidth : 字符串  列表宽度 默认100 
 *  widthType: 字符串 relative相对  absolute 绝对 默认relative
 *  rowStyler : 函数,  行样式格式化函数 默认null
 *  param:{}, 对象 查询参数对象，是一个对象,成员变量的名值对儿，会拼装到url中
 *  isPagination: 布尔 默认false 是否加载翻页控件
 *  paginationId: 字符串 分页div的id 默认null
 *  loadSuccessFunction: 函数 表格渲染后 加载的函数 默认null
 *  preQueryFuncion: 函数 查询前操作，如果返回tue则继续查询，返回false则不查询 默认null
 *  sortColumnFunction 排序操作
 *  isFristData: 布尔 第一次初始化table 是否加载数据 true加载 false不加载 默认 true
 *  sortName: 第一次加载数据的 排序 列名 排序列的名称 (逗号分隔)   ('name','type')
 *  sortOrder 第一次加载数据的 排序类型 排序列的类型 升序asc 降序desc (逗号分隔)  ('desc','asc')
 * }
 * 
 * columns=[
 *       {
 *        field:'emercey', 域的名称
 *        title:'紧急度', th中显示的问题
 *        width:5, 宽度
 *        align:'center', 文字的位置
 *        ischeckbox:true, 是否是复选框
 *        sortable:false, 是否可以排序
 *        formatter:function(value, rowdata, index){格式化函数(用于td中的内容 而不用于 th中的内容  th中的内容 以title为准)
 *        		value: 本列的值
 *              rowdata：行数据对象（包含当前行所有的数据）
 *              index：列序号
 *        }, 
 *        colspan:2 跨列
 *        rowspan:2 跨行
 *      }
 * ]
 * 
 ******************************************************************************/
(function($){

	/***************************************************************************
	 * 表格定义类
	 * 
	 * @param targetObj
	 *            需要添加表格的目标对象
	 * @param options
	 *            表格配置对象
	 * 
	 **************************************************************************/
	var TableGridDefinition = function(targetObj, options){

		this._targetObj = targetObj;
		this._options = options;
		this._paginationObj = $('#' + options.pageConifg.pageId);

		/*
		 * 初始化方法
		 * 
		 */
		this.init = function(){
			var _this = $(this)[0];

			// 设置默认排序
			if(this._options.sortName){
				var sortName = this._options.sortName.split(",");
				var sortOrder = this._options.sortOrder.split(",");
				$(sortName).each(function(i, value){
					_this.addSortObj(value, sortOrder[i]);
				});
			}

			if(this._options.data && this._options.data.length>0){// 如果有数据 直接生成表格
				this._options.dataCount = this._options.data.length;
				this.creatTable('initTable');
				// 分页
				if(this._options.isPagination){
					this.creatPagination(1, 10);
				}
			}else if(this._options.url){// 根据URL生成数据
				if(this._options.isFristData){
					this.getData(1, null, 'initTable');
				}else{
					this.creatTable('initTableNoData');
				}
			}else{
				this.creatTable('initTableNoData');
			}

		};

		/*
		 * 获取数据方法
		 * 
		 * @param loadFlag 生成表格的模式 
		 * 
		 * 'initTable' 初始化表格，清空targetObj 生成thead和tbody
		 * 'refreshTable' 刷新表格，清空tbody，重新生成tbody
		 * 'initTableNoData' 初始化表格，清空targetObj 只生成thead
		 */
		this.getData = function(currentPage, pageSize, loadFlag){

			if(this._options.isMask){
				// 蒙版打开
				this.openMask();
			}

			var _options = this._options;
			var _this = $(this)[0];

			if(this._options.preQueryFuncion && !this._options.preQueryFuncion()){
				if(this._options.isMask){
					// 蒙版关闭
					this.closeMask();
				}
				return;
			}

			// URL
			var url = this._options.url;

			// 分页信息
			if(!currentPage){
				currentPage = 1;
			}

			var pageSizeObj = $('#' + this._options.pageConifg.pageId).find('select');

			if(pageSizeObj && $(pageSizeObj).val() && $(pageSizeObj).val() != ''){
				pageSize = $(pageSizeObj).val();
			}else{
				pageSize = this._options.pageConifg.deafultPageSize;
			}

			url = url + '&currentPage=' + currentPage;
			url = url + '&pageSize=' + pageSize;

			// 排序信息
			var sortArray = this.getSortObj();
			if(sortArray){
				var sortName = '';
				var sortOrder = '';

				$(sortArray).each(function(index, entry){
					sortName = sortName + entry.sortName + ',';
					sortOrder = sortOrder + entry.sortOrder + ',';
				});

				sortName = sortName.substring(0, sortName.length - 1);
				sortOrder = sortOrder.substring(0, sortOrder.length - 1);

				url = url + '&sortName=' + sortName;
				url = url + '&sortOrder=' + sortOrder;

			}
			
			var _param = this._options.param;

			$.ajax({
				url : url,
				type : 'POST',
				data : _param,
				success : function(data){

					_options.data = data.tableData;
					_options.dataCount = data.count;
					
					if(data.mergesArray){
						_options.mergesArray = data.mergesArray;
					}

					// 加载前处理
					if(_options.beforeLoadFunction){
						_options = _options.beforeLoadFunction(data,_options);
					}

					// 表格
					_this.creatTable(loadFlag);

					// 分页
					if(_options.isPagination){
						_this.creatPagination(currentPage, pageSize);
					}

					// 加载成功后处理
					if(_options.loadSuccessFunction){
						_options.loadSuccessFunction(data);
					}

					if(_this._options.isMask){
						// 蒙版关闭
						_this.closeMask();
					}
				},
				error : function(e){
					if(_this._options.isMask){
						// 蒙版关闭
						_this.closeMask();
					}
					$.error('jQuery.tablegrid getData Error');
				}
			});

		};

		/*
		 * 创建表格方法
		 * 
		 * @param loadFlag 生成表格的模式 
		 * 
		 * 'initTable' 初始化表格，清空targetObj 生成thead和tbody
		 * 'refreshTable' 刷新表格，清空tbody，重新生成tbody 
		 * 'initTableNoData' 初始化表格，清空targetObj 只生成thead
		 * 
		 */
		this.creatTable = function(loadFlag){

			var _this = $(this)[0];

			switch (loadFlag) {
			case 'initTable':

				var tableObj = this.creatTableAndHead();

				// 创建 tbody
				var tbodyObj = this.creatTableBody(this._options.data);

				$(tableObj).append(tbodyObj);

				$(this._targetObj).find('table').remove();
				$(this._targetObj).append(tableObj);
				
				//拖拽改变列宽
				if(this._options.resizeColumns){
					this.resizeColumns(tableObj);
				}

				break;
			case 'refreshTable':

				// 创建 tbody
				var tbodyObj = this.creatTableBody(this._options.data);

				$(this._targetObj).find('tbody').remove();
				var tableObj = $(this._targetObj).find('table[class="'+this._options.tableClass+'"]');

				$(tableObj).append(tbodyObj);
				
				//清除所有 thead中的 checkbox选中状态
				$(this._targetObj).find('thead').find('input[type="checkbox"]').prop('checked',false);

				//拖拽改变列宽
				if(this._options.resizeColumns){
					this.resizeColumns(tableObj);
				}
				
				break;
			case 'initTableNoData':

				var tableObj = this.creatTableAndHead();

				$(this._targetObj).find('table').remove();
				$(this._targetObj).append(tableObj);

				//拖拽改变列宽
				if(this._options.resizeColumns){
					this.resizeColumns(tableObj);
				}
				
				break;
			default:
			}

			// 合并表格单元
			if(this._options.mergesArray){
				$(this._options.mergesArray).each(function(index, entry){
					_this.mergeCells(entry);
				});
			}

		};

		/*
		 * 创建表格(table)和thead
		 */
		this.creatTableAndHead = function(){
			
			var _this = this;
			
			var tableObj = $('<table></table>').addClass(this._options.tableClass).attr(this._options.tableAttribute);
			if(this._options.resizeColumns){
				$(tableObj).css('table-layout','fixed');
			}
			$(tableObj).attr('width', this._options.tableWidth + '%');

			var theadObj = $('<thead></thead>');
			
			//生成thead的内容
			var columnArray = this._options.columns;
			$(columnArray).each(function(index, entry){
				if($.isArray(entry)){
					var tableHeadTrObj = $('<tr></tr>');
					$(entry).each(function(_index,_entry){
						$(tableHeadTrObj).append(_this.creatTableCellTh(_entry,_index));
					});
					$(theadObj).append(tableHeadTrObj);
				}else{
					$(theadObj).append(_this.creatTableRow(true, null, null));
					return false;
				}
			});
			//生成thead的内容
			

			$(tableObj).append(theadObj);

			// 设置默认排序图标 初始化排序对象
			if(this._options.sortName){

				var sortName = this._options.sortName.split(",");
				var sortOrder = this._options.sortOrder.split(",");

				var sortArray = new Array();

				$(sortName).each(function(i, value){

					var sortObj = {
						sortName : value,
						sortOrder : sortOrder[i]
					};

					sortArray.push(sortObj);
				});

				$(this._targetObj).data('sort', sortArray);
			}

			return tableObj;

		};

		/*
		 * 创建表格body
		 * 
		 * @param data 行数据数组
		 * 
		 */
		this.creatTableBody = function(dataArray){

			var tbody = $('<tbody></tbody>');
			var _this = $(this)[0];

			if(dataArray && dataArray.length > 0){
				$(dataArray).each(function(index, entry){
					$(tbody).append(_this.creatTableRow(false, index, entry));
				});
			}else{
				// 没有数据时，表格的显示，目前不考虑这种情况
				/*
				 * var columnArrayLength = this._options.columns.length;
				 * 
				 * var height = $(this._targetObj).height();
				 * 
				 * var tdObj = $('<td colspan="' + columnArrayLength + '" ></td>').css('text-align',
				 * 'center').height(height + 50);
				 * 
				 * var div = $('<div></div>'); $(div).append('<div
				 * class="nodata_image">&nbsp;</div>').append('<font
				 * style="font-size: 20px">' + this._options.noDataMsg + '</font>');
				 * $(tdObj).append(div); $(tbody).append($('<tr></tr>').append(tdObj));
				 */
			}

			return tbody;
		};

		/*
		 * 创建表格行
		 * 
		 * @param isHead 表格头标志 true 生成表格头的行 false 生成普通行 
		 * @param index 行排序号 
		 * @param rowdata 行数据
		 * 
		 */
		this.creatTableRow = function(isHead, index, rowdata){

			var trObj = $('<tr></tr>');

			var columnArray = this._options.columns;
			var _this = $(this)[0];

			if(isHead){
				$(columnArray).each(function(index, entry){
					var td = _this.creatTableCellTh(entry, index);
					$(trObj).append(td);
				});
			}else{
				// 行号
				$(trObj).attr('trNumber', index);

				if(this._options.rowStyler){
					$(trObj).addClass(options.rowStyler(index, rowdata));
				}

				if(this._options.oddClass && index % 2 !== 0){
					$(trObj).addClass(this._options.oddClass);
				}

				$(trObj).data("rowdata", rowdata);

				$(columnArray).each(function(index, entry){
					trObj.append(_this.creatTableCell(entry, rowdata[entry.field], rowdata, index));
				});

			}

			return trObj;
		};

		/*
		 * 创建表格列td
		 * 
		 */
		this.creatTableCell = function(options, value, rowdata, index){
			var tdObj = $('<td></td>').attr('tdnumber', index);
			var _this = this;
			if(this._options.resizeColumns){
				$(tdObj).css('overflow','hidden').css('white-space','nowrap');
			}
			
			var content;

			if(options.ischeckbox){// 复选框

				var chObj = $('<input type="checkbox" value="'+value+'">').on('click',function(){
					if($(chObj).prop("checked")){//选中
						var isAllCheck = true;
						$(_this._targetObj).find('table').find('tbody tr').each(function(i,value){
							var chTr = $(value).children('td:eq('+index+')').find('input[type="checkbox"]');
							if(!$(chTr).prop("checked")){
								isAllCheck = false;
								return false;
							}
						});
						
						if(isAllCheck){
							$(_this._targetObj).find('table').find('thead tr').each(function(i,value){
								$(value).children('th:eq('+index+')').find('input[type="checkbox"]').prop('checked',true);
							});
						}
						
					}else{//取消
						$(_this._targetObj).find('table').find('thead tr').each(function(i,value){
							$(value).children('th:eq('+index+')').find('input[type="checkbox"]').prop('checked',false);
						});
					}
					
				});
				
				if(options.formatter){
					if(!options.formatter(value, rowdata, index)){
						$(chObj).attr('disabled','disabled');
					}
				}
				
				
				content = chObj;
				//2015-08-29 fix 当td的css中 有padding 的时候 checkbox 也会padding 就无法对齐了，所以强制padding为0
				$(tdObj).css('padding','0');
					
			}else{// 普通内容
				if(options.formatter){
					content = options.formatter(value, rowdata, index);
				}else{
					content = value;
				}
			}

			tdObj.append(content);

			if(options.align){
				tdObj.css('text-align', options.align);
			}

			return tdObj;

		};

		/*
		 * 创建表格列th
		 * 
		 */
		this.creatTableCellTh = function(options, index){
			var thObj = $('<th></th>');
			
			if(this._options.resizeColumns){
				$(thObj).css('overflow','hidden').css('white-space','nowrap');
				$(thObj).attr('widthref',options.width);
			}

			var _this = $(this)[0];

			if(options.ischeckbox){// 复选框
				var chObj = $('<input type="checkbox">').on('click', function(){
					if($(this).prop('checked') == false){
						$(_this._targetObj).children('table').find('tbody tr').each(function(i, value){
							$(value).children('td:eq(' + index + ')').find('input[type="checkbox"]').prop('checked', false);
						});
					}else{
						$(_this._targetObj).children('table').find('tbody tr').each(function(i, value){
							var chTr = $(value).children('td:eq(' + index + ')').find('input[type="checkbox"]');
							if(!$(chTr).prop('disabled')){
								$(chTr).prop('checked', true);
							}
							
						});
					}
				});

				thObj.append(chObj);
			}else{// 普通文本
				thObj.append(options.title);
			}

			if(options.align){
				thObj.css('text-align', options.align);
			}
			
			if(options.rowspan){
				thObj.attr('rowspan', options.rowspan);
			}
			
			if(options.colspan){
				thObj.attr('colspan', options.colspan);
			}

			if(options.width){
				if(this._options.widthType == 'relative'){
					thObj.attr("width", options.width + "%");
				}else{
					thObj.attr("width", options.width + "px");
				}
			}

			// 此列可排序
			if(options.sortable){
				$(thObj).addClass('sorting').on('click', function(){
					if($(this).attr('class') == 'sorting'){// 当前此列不排序
						// 对当前列进行升序排列
						$(this).attr('class', 'sorting_asc');
						_this.addSortObj(options.field, 'asc');
					}else if($(this).attr('class') == 'sorting_asc'){// 当前此列是升序
						// 对当前列进行降序排列
						$(this).attr('class', 'sorting_desc');
						_this.addSortObj(options.field, 'desc');
					}else if($(this).attr('class') == 'sorting_desc'){// 当前此列是降序
						// 对当前列不排序
						$(this).attr('class', 'sorting');
						_this.deleteSortObj(options.field);
					}

					// 点击排序的回调函数
					if(_this._options.sortColumnFunction){
						// 排序信息
						var sortArray = _this.getSortObj();

						var sortName = '';
						var sortOrder = '';
						$(sortArray).each(function(index, entry){
							sortName = sortName + entry.sortName + ',';
							sortOrder = sortOrder + entry.sortOrder + ',';
						});
						sortName = sortName.substring(0, sortName.length - 1);
						sortOrder = sortOrder.substring(0, sortOrder.length - 1);

						_this._options.sortColumnFunction(sortName, sortOrder);
					}
					// 重新加载数据
					_this.reload();
				});

				// 设置默认排序图标
				if(this._options.sortName){
					var sortName = this._options.sortName.split(",");
					var sortOrder = this._options.sortOrder.split(",");

					$(sortName).each(function(i, value){
						if(value == options.field){
							$(thObj).removeClass();
							$(thObj).addClass('sorting_' + sortOrder[i]);
							return false;
						}
					});
				}

			}

			return thObj;
		};

		/**
		 * 添加排序对象
		 */
		this.addSortObj = function(sortName, sortOrder){
			var sortArray = this.getSortObj(targetObj);
			var sortObj = {
				sortName : sortName,
				sortOrder : sortOrder
			};

			sortArray = $.grep(sortArray, function(entry, index){
				return entry.sortName == sortName;
			}, true);

			sortArray.push(sortObj);

			$(this._targetObj).data('sort', sortArray);
		};

		/**
		 * 删除排序对象
		 */
		this.deleteSortObj = function(sortName){
			var sortArray = this.getSortObj(targetObj);

			sortArray = $.grep(sortArray, function(entry, index){
				return entry.sortName == sortName;
			}, true);

			$(this._targetObj).data('sort', sortArray);
		};

		/**
		 * 获取排序对象
		 */
		this.getSortObj = function(){
			var sortObj = $(targetObj).data('sort');
			if(!sortObj){
				sortObj = new Array();
				$(this._targetObj).data('sort', sortObj);
			}

			return sortObj;
		};
		
		/**
		 * 列拖拽
		 */
		this.resizeColumns = function(tableObj){
			
		    $("body").bind("selectstart", function() { 
		    	return !lineMove;
		    });
			
			$(tableObj).find('td,th').each(function(index,entry){
				$(entry).bind('mousedown',function(event){
					var pos = $(entry).offset();
					var th = null;
					if (event.clientX - pos.left < 4 || ($(entry).width() - (event.clientX - pos.left)) < 4) {//按下去
						lineMove = true;
						$(tableObj).attr('startX',event.clientX);
						
						//去当前列序号
						var index = $(entry).prevAll().length;
						
						//获取当前列的th
						th = $(tableObj).find('th:eq('+index+')');
						
			            //取左边的对象
			            if (event.clientX - pos.left < th.width() / 2) {
			                currTh = th.prev();
			            }else {
			                currTh = th;
			            }
			            //取右边对象
			            if(currTh && $(currTh).nextAll().length != 0 ){
			            	 rightTh = $(currTh).next();
			            }
					}
					
				}).bind('mousemove',function(event){//拖动 or 鼠标滑过
					var startX = $(tableObj).attr('startX');
					 
					if (event.clientX - $(entry).offset().left < 4 || ($(entry).width() - (event.clientX - $(entry).offset().left)) < 4) {
					    $(entry).css({ 'cursor': 'w-resize' });
					}else {
						if($(entry).is('th')){
							$(entry).css({ 'cursor': 'pointer' });
						}else{
							$(entry).css({ 'cursor': 'default' });
						}
					}
					
			        if(lineMove == true && rightTh && currTh){
			           	var pos = $(currTh).offset();
			           
			           	if(pos && event.clientX != pos.left){
			           		var addPencert = (event.clientX-startX)/$(tableObj).width() * 100;
			           		addPencert = Math.round(addPencert*100)/100;
			           	    var currentOPencert = parseFloat($(currTh).attr('widthRef'));
			           	    var rightOPencert =  parseFloat($(rightTh).attr('widthRef'));
			           	   $(currTh).attr('width',(currentOPencert+addPencert)+'%');
			           	   $(rightTh).attr('width',(rightOPencert-addPencert)+'%');
			           	}
			        }
					
				}).bind('mouseup',function(event){//抬起来
					
			    	lineMove = false;
			        if(currTh){
				        var currentFinalWidth = $(currTh).attr('width');
				        if(currentFinalWidth){
					        currentFinalWidth = currentFinalWidth.substring(0,currentFinalWidth.length-1);
					        $(currTh).attr('widthRef',currentFinalWidth);
				        }
			        }
			        if(rightTh){
				        var currentRightWidth = $(rightTh).attr('width');
				        if(currentRightWidth){
				         currentRightWidth = currentRightWidth.substring(0,currentRightWidth.length-1);
			        	 $(rightTh).attr('widthRef',currentRightWidth);
				        }
			        }
			        currTh = null;
			        rightTh = null;
					
				});
			});
		};

		// ////////////分页部分//////////////

		/*
		 * 创建分页区域
		 * 
		 */
		this.creatPagination = function(currentPage, pageSize){

			var opts = this._options;
			var count = this._options.dataCount;
			var targetObj = this._targetObj;
			var _this = this;
			currentPage = parseInt(currentPage);

			var pageTargetObj = this._paginationObj;

			pageTargetObj.empty();

			var page = $('<div></div>').addClass('pagination');

			// 页数
			var maxPage = this.getMaxPage(pageSize, count);

			// 左边内容
			page.append(this.creatLeftContent(currentPage, pageSize, count));

			// 右边内容
			var ulObj = $('<ul></ul>').attr('PaginationOptions', 'ulList');

			var fristPageObj = $('<li></li>').append('<a href="javascript:void(0);">' + opts.pageConifg.fristPageText + '</a>').on('click', function(){
				_this.getData(1, pageSize, 'refreshTable');
			});

			var prevPageObj = $('<li></li>').append('<a href="javascript:void(0);">' + opts.pageConifg.prevPageText + '</a>').on('click', function(){
				if(_this.getCurrenPage() != 1){
					_this.getData(_this.getCurrenPage() - 1, pageSize, 'refreshTable');
				}
			});

			var nextPageObj = $('<li></li>').append('<a href="javascript:void(0);">' + opts.pageConifg.nextPageText + '</a>').on('click', function(){
				if(_this.getCurrenPage() != maxPage){
					_this.getData(_this.getCurrenPage() + 1, pageSize, 'refreshTable');
				}
			});

			var lastPageObj = $('<li></li>').append('<a href="javascript:void(0);">' + opts.pageConifg.lastPageText + '</a>').on('click', function(){
				_this.getData(maxPage, pageSize, 'refreshTable');
			});

			var confirmObj = $('<li></li>').append('<a href="javascript:void(0);">' + opts.pageConifg.confirmText + '</a>').on('click', function(){

				var textValue = $(pageTargetObj).find('input[type="text"]').val();

				if(textValue > 0 && textValue <= maxPage){
					_this.getData(textValue, pageSize, 'refreshTable');
				}

			});

			var goPageObj = $('<li></li>').addClass('pagination-gopage');
			var goPageInputText = $('<input type="text" value="" />');
			goPageObj.append('到').append(goPageInputText).append('页');

			$(ulObj).append(fristPageObj).append(prevPageObj);

			// /////////////////////////////////////////////////////////

			var defaultNum = 6;

			if(currentPage < 6){

				if(maxPage < defaultNum){
					defaultNum = maxPage;
				}

				for ( var j = 0; j < defaultNum; j++){
					if(j + 1 == currentPage){
						$(ulObj).append(this.creatLi(j + 1, 'active', pageSize, targetObj));
					}else{
						$(ulObj).append(this.creatLi(j + 1, '', pageSize, targetObj));
					}
				}

				if(maxPage > 5){
					$(ulObj).append('<li class="disabled"><a href="#">...</a></li>');
				}

			}else if(currentPage > maxPage - 5){

				$(ulObj).append('<li class="disabled"><a href="#">...</a></li>');

				for ( var i = maxPage - 4; i < maxPage + 1; i++){

					if(i == currentPage){
						$(ulObj).append(this.creatLi(i, 'active', pageSize, targetObj));
					}else{
						$(ulObj).append(this.creatLi(i, '', pageSize, targetObj));
					}

				}
			}else{

				$(ulObj).append('<li class="disabled"><a href="#">...</a></li>');

				for (i = currentPage - 2; i < currentPage + 3; i++){

					if(i == currentPage){
						$(ulObj).append(this.creatLi(i, 'active', pageSize, targetObj));
					}else{
						$(ulObj).append(this.creatLi(i, '', pageSize, targetObj));
					}

				}

				$(ulObj).append('<li class="disabled"><a href="#">...</a></li>');
			}
			// ///////////////////////////////////////////////

			$(ulObj).append(nextPageObj).append(lastPageObj).append(goPageObj).append(confirmObj);

			page.append(ulObj);

			pageTargetObj.append(page);

		};

		/**
		 * 获取最大页数
		 */
		this.getMaxPage = function(pageSize, count){

			var pageSizeInt = parseInt(pageSize);
			var countInt = parseInt(count);

			if(countInt % pageSizeInt == 0){
				return parseInt(countInt / pageSizeInt);
			}else{
				return parseInt(countInt / pageSizeInt) + 1;
			}
		};

		/**
		 * 生成左边内容
		 */
		this.creatLeftContent = function(currentPage, pageSize, count){
			
			var _this = this;

			var pageConifg = this._options.pageConifg;

			var leftContent = $('<div></div>').addClass('pagination-conleft');

			var selectObj = $('<select></select>').attr('PaginationOptions', 'pageSize').on('change', function(){
				_this.getData(1, $(this).val(), 'refreshTable');
			});

			$(pageConifg.pageSizeList).each(function(index, entry){
				var optionObj = $('<option></option>').append(entry).attr('value', entry);

				if(entry + '' == pageSize + ''){
					optionObj.attr('selected', 'selected');
				}

				selectObj.append(optionObj);
			});

			$(leftContent).append(pageConifg.beforePageText).append(selectObj).append(pageConifg.afterPageText);
			$(leftContent).append('&nbsp;').append(pageConifg.beforeTotalText).append(count).append(pageConifg.afterTotalText);

			return leftContent;
		};

		/**
		 * 生成Li
		 */
		this.creatLi = function(num, cls, pageSize){
			
			var _this = this;

			var liObj = $('<li></li>').on('click', function(){
				_this.getData(num, pageSize, 'refreshTable');
			});

			if(cls != ''){
				liObj.addClass(cls);
			}

			var aObj = $('<a href="javascript:void(0);"></a>').append(num);

			liObj.append(aObj);

			return liObj;
		};

		/**
		 * 获取当前页
		 */
		this.getCurrenPage = function(){
			var ulList = $("ul[PaginationOptions='ulList']").children();

			for ( var i = 0; i < ulList.length; i++){
				if($(ulList[i]).attr('class') == 'active'){
					return parseInt($(ulList[i]).find('a').html());
				}
			}

		};

		// ////////////分页部分//////////////

		// ///////////////////////蒙版部分///////////////////////////

		/**
		 * 打开蒙版
		 */
		this.openMask = function(){

			var targetObj = this._targetObj;
			var msg = this._options.loadMsg;

			var offset = targetObj.offset();
			var height = $(targetObj).height();
			var width = $(targetObj).width();

			var contentWidth = 240;
			var contentHeight = 55;

			if(height == 500){
				height = 600;
			}

			var backgroundDiv = $("<div class='mask_background_div'></div>").height(height+35).width(width + 40).offset(offset);

			var gifObj = $('<div>&nbsp;</div>').addClass('mask_image');

			var contentDiv = $('<div class="mask_msg_div" ></div>').height(contentHeight).width(contentWidth).offset({
				top : offset.top + ((height - contentHeight) / 2),
				left : offset.left + ((width - contentWidth) / 2)
			}).append('<div>' + msg + '</div>').append(gifObj);

			$(backgroundDiv).appendTo(targetObj);
			$(contentDiv).appendTo(targetObj);
		};

		/**
		 * 关闭蒙版
		 */
		this.closeMask = function(){
			var targetObj = this._targetObj;
			$(targetObj).find('div[class="mask_background_div"]').remove();
			$(targetObj).find('div[class="mask_msg_div"]').remove();
		};

		// ////////////////////////蒙版部分///////////////////////////

		/*
		 * 根据行号和列号获取单元格的方法
		 * 
		 */
		this.getCell = function(rowIndex, coloumIndex){
			var trObj = $(this._targetObj).find('tr[trnumber="' + rowIndex + '"]');

			if(!trObj){
				return null;
			}

			var tdObj = $(trObj).find('td[tdnumber="' + coloumIndex + '"]');

			if(!tdObj){
				return null;
			}else{
				return tdObj;
			}
		};

		// ////////////对外提供的方法//////////////

		/*
		 * 合并单元格方法 rowIndex: 0, coloumIndex: 1, rowspan: 3
		 * 
		 */

		this.mergeCells = function(param){

			var rowIndex = parseInt(param.rowIndex);
			var coloumIndex = parseInt(param.coloumIndex);
			var num = parseInt(param.rowspan);
			if(param.rowspan){// 跨行
				var tdObj = this.getCell(rowIndex, coloumIndex);

				// 当前TD
				$(tdObj).attr('rowspan', num);

				// 删除受影响的其他TD
				// 删除和他同一列的 n行数据

				for ( var i = 0; i < num - 1; i++){
					var entry = this.getCell(rowIndex + i + 1, coloumIndex);
					$(entry).remove();
				}

			}else if(param.colspan){// 跨列

				var tdObj = this.getCell(rowIndex, coloumIndex);
				// 当前TD
				$(tdObj).attr('colspan', num);

				// 删除受影响的其他TD
				// 删除和他同一行 n列数据

				for ( var i = 0; i < num - 1; i++){
					var entry = this.getCell(rowIndex, coloumIndex + i + 1);
					$(entry).remove();
				}

			}else{
				return;
			}
		};

		/*
		 * 重新加载方法
		 * 
		 */
		this.reload = function(param){

			if(param){
				this._options.param = param;
			}

			this.getData(null, null, 'refreshTable');
		};

		/*
		 * 获取选择的数据行方法
		 * 
		 */
		this.getSelect = function(){
			var targetObj = this._targetObj;
			var opts = this._options;
			var index = 0;

			$(opts.columns).each(function(i, entry){
				if(entry.ischeckbox){
					index = i;
				}
			});

			var array = new Array();

			$(targetObj).children('table').find('tbody tr').each(function(i, value){
				var chObj = $(value).children('td:eq(' + index + ')').find('input[type="checkbox"]');
				if($(chObj).prop('checked') == true){
					array.push($(value).data("rowdata"));
				}
			});

			return array;
		};
		
		this.destory = function(){
			var targetObj = this._targetObj;
			var opts = this._options;
			if(opts.pageConifg.pageId){
				$('#'+opts.pageConifg.pageId).empty();
			}
			
			TableGridInstanceObject[$(targetObj).attr('id')] = null;
			$(targetObj).empty();
		}
		// ////////////对外提供的方法//////////////

	};

	//全局变量-表格定义对象实体
	var TableGridInstanceObject = new Object();
	
	//全局变量-当前是否处于调整列宽状态
	var lineMove = false;
	
	//全局变量-被拖动的列的左侧th
	var currTh;
	
	//全局变量-被拖动的列的右侧th
	var rightTh;

	$.fn.tablegrid = function(arg0, arg1){

		var tablegrid;

		if(typeof arg0 === 'object'){

			var options = arg0;
			var pageOpts = $.extend({}, $.fn.tablegrid.defaults.pageConifg, options.pageConifg);
			var opts = $.extend({}, $.fn.tablegrid.defaults, options);
			opts.pageConifg = pageOpts;

			tablegrid = new TableGridDefinition($(this), opts);
			TableGridInstanceObject[$(this).attr('id')] = tablegrid;
			tablegrid.init();
		}else if(arg0 == 'reload'){
			tablegrid = TableGridInstanceObject[$(this).attr('id')];
			tablegrid.reload(arg1);
		}else if(arg0 == 'getSelect'){
			tablegrid = TableGridInstanceObject[$(this).attr('id')];
			return tablegrid.getSelect();
		}else{
			$.error('Method[' + method + ']does not exist on jQuery.tablegrid');
		}
		
		return tablegrid;

	};

	/**
	 * Default Configuration
	 */
	$.fn.tablegrid.defaults = {
		url : null,
		columns : [],
		data : [],
		dataCount : 0,
		tableWidth : '100',
		tableAttribute : {border:'0',cellspacing:'0',cellpadding:'0'},
		rowStyler : null,
		param : '',
		isPagination : false,
		isFristData : true,
		widthType : 'relative',
		loadMsg : '正在努力加载 请稍后。。。',
		noDataMsg : '没有查询到结果',
		mergesArray : null,
		tableClass : 'tablegrid',
		oddClass : null,
		pageConifg : {
			pageId : '',
			pageSizeList : [ 10, 20, 30, 40, 50 ],
			deafultPageSize : 10,
			beforeTotalText : '总共',
			afterTotalText : '条数据',
			beforePageText : '每页显示',
			afterPageText : '条记录',
			fristPageText : '首页',
			prevPageText : '&#9668;上一页',
			nextPageText : '下一页&#9658;',
			lastPageText : '尾页',
			confirmText : '确定'
		},
		loadSuccessFunction : null,
		beforeLoadFunction : null,
		sortColumnFunction : null,
		preQueryFuncion : null,
		sortName : '',
		sortOrder : '',
		resizeColumns : false,
		isMask:true
	};

})(jQuery);
